package ru.xeden.core.exception;

/**
 * Суперкласс для всех исключений core
 */
public class CoreException
    extends Exception
{
    private UnlocalisedMessage m_unlocaliseMessage;
    /**
     * Дефолтный префикс
     */
    private static final String PREFIX = "xeden.core.err.";
    /**
     * Обертка для другого исключения
     */
    private static final String IDS_WRAPPED_EXCEPTION = "xeden.core.err.wrappedException";
    /**
     * Метод ''{0}'' не реализован. (Используется для заглушек в процессе разработки)
     */
    public static final String IDS_METHOD_IS_NOT_IMPLEMENTED = "methodIsNotImplemented";
    /**
     * Метод ''{0}'' не поддерживается.
     */
    public static final String IDS_METHOD_IS_NOT_SUPPORTED = "methodIsNotSupported";

    /**
     * @return возвращает префикс для ID строки сообщения в ресурсном файле.
     *         Генерируемая ID сообщения передается в {@link UnlocalisedMessage},
     *         используется для удобной группировки сообщений в ресурсном файле
     */
    protected String getPrefix()
    {
        return PREFIX;
    }

    /**
     * Конструктор
     *
     * @param exception оборачивает другое исключение
     */
    public CoreException(Exception exception)
    {
        super(IDS_WRAPPED_EXCEPTION);
        m_unlocaliseMessage = UnlocalisedMessage.createUnlocaliseMessage(exception.getMessage());
    }

    /**
     * Конструктор
     *
     * @param errorId принимает ID сообщения исключения, к которому в начало добавляется префикс
     */
    public CoreException(String errorId)
    {
        super(errorId);
        m_unlocaliseMessage = UnlocalisedMessage.createUnlocaliseMessage(getPrefix() + errorId);
    }

    /**
     * Конструктор
     *
     * @param errorId - принимает ID сообщения исключения, к которому в начало добавляется префикс
     * @param arg     - аргумент, который подставляется в шаблон сообщения
     */
    public CoreException(String errorId, Object arg)
    {
        super(errorId);
        m_unlocaliseMessage = UnlocalisedMessage.createUnlocaliseMessage(getPrefix() + errorId, arg);
    }

    /**
     * Конструктор
     *
     * @param errorId - принимает ID сообщения исключения, к которому в начало добавляется префикс
     * @param args    - аргументы, которые подставлюется в шаблон сообщения
     */
    public CoreException(String errorId, Object [] args)
    {
        super(errorId);
        m_unlocaliseMessage = UnlocalisedMessage
            .createUnlocaliseMessage(getPrefix() + errorId, args);
    }

    /**
     * @return нелакализованное сообщение об ошибке
     */
    public UnlocalisedMessage getUnlocaliseMessage()
    {
        return m_unlocaliseMessage;
    }
}
